package freemind.controller;

import java.util.ArrayList;
import java.util.HashMap;

import freemind.controller.NodeAdapterBase;
import freemind.main.XMLElement;
import freemind.main.XMLParseException;
import freemind.modes.browsemode.BrowseNodeModel;

public class XMLMindMapSaveProtocol extends XMLProtocolBase implements XMLProtocol  {

	XMLElement criados;
	XMLElement salvos;
	
	HashMap<Integer,BrowseNodeModel> listaCriados;
	
	XMLElement request,response;
	
	public XMLMindMapSaveProtocol(int eneg_modulo) {
		super(XMLProtocol.SAVE,eneg_modulo);
		
		 criados = new XMLElement();
		 criados.setName("criados");
		 
		 salvos = new XMLElement();
		 salvos.setName("salvos");
		 
		 listaCriados = new HashMap<Integer,BrowseNodeModel>();
	}
	
	public void makeRequest(BrowseNodeModel root){
		super.makeRequest();
		request = super.getXML(root.getAdapter());
		
		this.procurarAdicionar(root);
		
		XMLElement rootElement = root.getAdapter().getXMLFromBean();
		rootElement.setName("root");
				
		request.addChild(salvos);
		request.addChild(criados);
		request.addChild(rootElement);
	}
	
	public XMLElement getXML(){

		if( this.getOperacao() == XMLProtocol.REQUEST ){
//			System.out.println("REQUEST SAVE: " + request.toString());
			return request;
		}
		else if( this.getOperacao() == XMLProtocol.RESPONSE ){
//			System.out.println("RESPONSE SAVE: " + response.toString());
			return response;
		}
		
		return null;
	}
	
	public XMLElement readXML(String s) throws XMLParseException{
		XMLElement newElement = super.readXML(s);
		
		if( this.getOperacao()==XMLProtocol.REQUEST ){
			this.request = newElement;
			
			this.salvos = (XMLElement) newElement.getChildren().get(1);
			this.criados = (XMLElement)newElement.getChildren().get(2);			
		}
		else if( this.getOperacao() == XMLProtocol.RESPONSE ){
			this.response = newElement;
		}				


		
		return newElement;
	}
	
	public ArrayList<NodeAdapterBase> getCriadosSucesso(){
		
		ArrayList<NodeAdapterBase> criadosSucesso = new ArrayList<NodeAdapterBase>();
		
//		System.out.println("GETCRIADOS");
		
		XMLElement criados = (XMLElement) response.getChildren().get(1);
		for( Object o: criados.getChildren() ){
//			System.out.println("ADICIONANDO A CRIADOS");
			XMLElement no = (XMLElement) o;
						
			NodeAdapterBase na = NodeAdapterBase.getAdapterFromEnegModulo(this.getEnegModulo());						
			na.getBeanFromXML(no);
			
			criadosSucesso.add(na);
			
//			System.out.println("ADICIONOU");
		}
		
//		System.out.println(criadosSucesso.size());
		
		return criadosSucesso;				
	}
	
	public HashMap<Integer,BrowseNodeModel> getCriados(){
		return this.listaCriados;
	}
	
	public void procurarAdicionar(BrowseNodeModel root){
		adicionarNo(root,false);
		
		for(int i=0;i<root.getChildCount();i++){
			BrowseNodeModel child = (BrowseNodeModel) root.getChildAtIgnoreFolded(i);			
			procurarAdicionar( child );
		}
		
	}
			
	public XMLElement adicionarNo(BrowseNodeModel node,boolean createdChild){

		if( !node.isChanged() && !node.isCreated() ){
			return null;
		}
		
		XMLElement no = node.getAdapter().getXMLFromBean();			
		
		if( node.isCreated() ){

			listaCriados.put(node.getAdapter().getVirtualId(), node);
			XMLElement filhos = new XMLElement();
			filhos.setName("filhos");

			for(int i=0;i<node.getChildCount();i++){
				BrowseNodeModel child = (BrowseNodeModel) node.getChildAtIgnoreFolded(i);
				
				filhos.addChild( adicionarNo(child,true) );
			}
			
			no.addChild(filhos);
			
			if( !createdChild ){
				criados.addChild(no);
			}
			node.hasSaved();
		}
		else if( node.isChanged() ){
			
			salvos.addChild(no);
			node.hasSaved();
		}
		
		return no; 
	}
	
}
